package ExpressTwo;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class InterfaceAction implements ActionListener {
    private final MainInterface _D;
    InterfaceAction(MainInterface d) {
        _D = d;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        switch (e.getActionCommand()) {
            case "清空":
                _D.text.setText("");
                break;
            case "确定":
                String str = _D.text.getText();//获取数字
                _D.text.setText("");
                boolean flag=false;
                //判断str是否是十六进制，或者str是十进制的数
                if (_D.box1.isSelected()) {
                    //十六进制

                    try {
                        _D.logicAddress = Integer.parseInt(str, 16);//十六进制转换位十进制函数
                        if(_D.logicAddress>=_D.pageLong*_D.blockSize*1024)
                            throw new Exception();
                    }catch (Exception exception){
                        flag=true;
                        JOptionPane.showMessageDialog(null,
                                "输入错误,请重新输入\n(允许最大输入 0x"+Integer.toHexString(_D.pageLong*_D.blockSize*1024-1).toUpperCase()+" ( "+(_D.pageLong*_D.blockSize*1024-1)+" ))");
                    }
                } else {
                    //十进制
                    try {
                        _D.logicAddress = Integer.parseInt(str);//十六进制转换位十进制函数
                        if (_D.logicAddress >= _D.pageLong * _D.blockSize*1024)
                            throw new Exception();
                    } catch (Exception exception) {
                        flag = true;
                        JOptionPane.showMessageDialog(null,
                                "输入错误,请重新输入\n(允许最大输入 0x" + Integer.toHexString(_D.pageLong * _D.blockSize * 1024 - 1).toUpperCase() + " ( " + (_D.pageLong * _D.blockSize * 1024 - 1) + " ))");
                    }
                }
                //_D.list_opt.add(new OPTNode(_D.logicAddress/_D.pageLong*_D.blockSize*1024,_D.logicAddress,_D.list_bitMapFIFO.get(0)));
                //如果输入合法，执行下面的工作
                if(!flag){
                    //访问次数增加
                    _D.accessCount++;
                    //保存位示图，便于从头弹出
                    getBitMapInformation();
                    //需要做的功能：
                    //获取位示图信息，三个
                    //1.更改状态区
                    //2.更改FIFO算法部分
                    //2.1更改FIFO算法的左边部分
                    //2.2更改FIFO算法的置换流程
                    //3.更改LRU算法部分
                    //3.1更改LRU算法的左边部分
                    //3.2更改LRU算法的置换流程

                    //更改状态区
                    new StatusChange(_D).change();

                    //更改FIFO算法部分
                    new FirstInFirstOut(_D).change();

                    //更改LRU算法部分 similar with fifo
                    new LeastRecentlyUsed(_D).change();

                    _D.list_opt.add(new Node(_D.logicAddress/(_D.blockSize*1024),_D.logicAddress));


                }
                break;
            case "OPT算法":
                Thread t=new Thread(()->{
                    new OptimalReplacement(_D);
                });
                t.start();
                //new OptimalReplacement(_D);

                break;
            case "退出":
                System.exit(0);
                break;
        }
    }
    void getBitMapInformation(){

        JTable table=_D.getBitMap_table();
        for(int i=0;i<table.getRowCount();i++){
            for(int j=0;j<table.getColumnCount();j++){
                if("0".equals(table.getValueAt(i,j))){
                    //如果位示图中找到了三个位置，那么把这三个位置记录下来
                    if(_D.bitCount>=_D.blockNumber){
                        //结束
                        return;
                    }
                    _D.list_bitMapFIFO.add(i*table.getColumnCount()+j);
                    _D.list_bitMapLRU.add(i*table.getColumnCount()+j);

                    //计数器
                    _D.bitCount++;
                }
            }
        }
    }
}
